Nacos 服务中心搭建环境
Nacos 是什么?
Nacos 是一个服务注册中心,也是一个配置中心,这篇笔记就按照官网的配置一步步配置下来,把踩的坑记录下来
搭建 nacos-server
前言:Nacos 自己就是服务中心,所以它不用像 Eureka 那样需要自己配置一个 Server,直接使用阿里提供的 nacos-server 工具安装使用就行了,每个微服务模块都只需要配置服务发现
首先下载安装 nacos-server
wget https://github.com/alibaba/nacos/releases/download/2.0.1/nacos-server-2.0.1.tar.gz
tar -xvf nacos-server-2.0.1.tar.gz
启动命令
cd nacos/bin
# 这个 standalone 代表着单机模式运行,非集群模式
sh startup.sh -m standalone
启动失败,检测日志发现是内存不够
# 首先检查当前内存大小
free -h
# 然后可以使用 top 命令监控进程,使用 kill 命令杀掉某个进程
要解决这个问题就要修改这个启动时指定的内存,那么我们修改一下这个启动脚本 startup.sh
vim startup.sh
可以看到这段配置(standalone 的那个):
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
将 512 修改为 256 即可
如果出现以下报错:
[[: not found
这是因为 Ubuntu 的 sh
命令无法识别 "[[]]"
表达式。
bash startup.sh -m standalone
然后访问
http://localhost:8848/nacos/#/login
就可以看到界面了,默认账号/密码: nacos/nacos
使用 Nacos 启动配置管理
使用 Nacos 可以很方便做配置中心,如下配置一个简单的 DEMO 来接收变更的配置
官方的源码:nacos-spring-boot-config-example
配置环境
首先引入 Spring Cloud Alibaba 的大礼包
<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
然后主要引入下面两个
<!--整合 actuator 监视服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
</dependency>
在 Spring Boot 添加依赖
<properties>
<nacos-config-spring-boot.version>0.2.7</nacos-config-spring-boot.version>
</properties>
<!-- ............ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${nacos-config-spring-boot.version}</version>
</dependency>
<!-- 注意!!!在 SpringCloud 要用下面这个依赖,就不用上面那个了 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-actuator</artifactId>
<version>${nacos-config-spring-boot.version}</version>
</dependency>
<!-- 同理:nacos-config-spring-boot-actuator 应该使用 SpringCloud 的 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在 application.yml
中配置 Nacos server 的地址,以及开放健康检查
nacos:
discovery:
server-addr: 192.168.211.138:8848
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
使用 @NacosPropertySource
加载 dataId 为 example 的配置源,并开启自动更新:
@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
通过 Nacos 的 @NacosValue
注解设置属性值。
@RestController()
@RequestMapping("/config")
public class ConfigController {
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
@GetMapping("/get")
public boolean get() {
return useLocalCache;
}
}
启动测试
启动 NacosConfigApplication,调用
curl http://localhost:8080/config/get
返回内容是 false
通过调用 Nacos Open API 向 Nacos server 发布配置:dataId 为 example,内容为 useLocalCache=true
curl -X POST "http://localhost:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=useLocalCache=true"
再次访问发现返回值已经是 true
了
curl http://localhost:8080/config/get
启动服务发现
在 Spring Boot 项目中启动 Nacos 的服务发现功能 官方的源码 nacos-spring-boot-discovery-example
配置环境
同理:
<!--整合 actuator 监视服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
</dependency>
<!-- 注意!!!在 SpringCloud 要用下面这个依赖,就不用上面那个了 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在 application.yml
中配置 Nacos server 的地址,以及开放健康检查
nacos:
discovery:
server-addr: 192.168.211.138:8848
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
获取配置信息
使用 @NacosInjected
注入 Nacos 的 NamingService 实例:
@RestController
@RequestMapping("discovery")
public class DiscoveryController {
// 这个注解将 ConfigService 或 NamingService 实例注入目标 Bean 的注解。
@NacosInjected
private NamingService namingService;
@GetMapping("/get")
public List<Instance> get(@RequestParam String serviceName) throws NacosException {
return namingService.getAllInstances(serviceName);
}
}
启动类默认就行了
@SpringBootApplication
public class NacosDiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryApplication.class, args);
}
}
启动测试
启动 NacosDiscoveryApplication,调用,此时返回为空 JSON 数组 []
。
curl http://localhost:8080/discovery/get?serviceName=example
通过调用 Nacos Open API 向 Nacos server 注册一个名称为 example 服务
curl -X PUT 'http://localhost:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080'
如果是 Powershell 中使用 curl.exe
因为 Powershell 中的 curl 为 ps 原生命令 Invoke-WebRequest 的别名。
想要 调用 curl,应在 ps 中输入:curl.exe
及参数,问题解决
curl.exe -X PUT 'http://localhost:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080'
可以看到
再次访问
curl.exe http://localhost:8080/discovery/get?serviceName=example
此时返回内容为:
[
{
"instanceId": "127.0.0.1-8080-DEFAULT-example",
"ip": "127.0.0.1",
"port": 8080,
"weight": 1.0,
"healthy": true,
"cluster": {
"serviceName": null,
"name": "",
"healthChecker": {
"type": "TCP"
},
"defaultPort": 80,
"defaultCheckPort": 80,
"useIPPort4Check": true,
"metadata": {}
},
"service": null,
"metadata": {}
}
]
命名空间和 DataId
命名空间 和 DataId 主要用来解决如下两个问题
问题1:实际开发中,通常一个系统会准备
- dev 开发环境
- test 测试环境
- prod 生产环境
如何保证指定环境启动时服务能正确读取到 Nacos 上相应环境的配置文件呢?
问题2:一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?
Nacos 的图形化管理界面
Namespace + Group + DataId 三者关系?为什么这么设计?
它们的关系类似 Java 里面的 package 名和类名最外层的 namespace 是可以用于区分部署环境的,Group 和 DataId 逻辑上区分两个目标对象。
默认情况:Namespace=public,Group=DEFAULT_GROUP,默认 Cluster 是 DEFAULT
1、Nacos 默认的 Namespace 是 public,Namespace 主要用来实现隔离:比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个 Namespace,不同的 Namespace 之间是隔离的。
2、Group 默认是 DEFAULT_GROUP,Group 可以把不同的微服务划分到同一个分组里面去
3、Service 就是微服务:一个 Service 可以包含多个 Cluster(集群),Nacos 默认 Cluster 是 DEFAULT,Cluster 是对指定微服务的一个虚拟划分。比方说为了容灾,将 Service 微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的 Service 微服务起一个集群名称(HZ) ,给广州机房的 Service 微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
4、最后是 Instance,就是微服务的实例。